Wir wissen aus dem Video zu Interrupts und Traps auf dem X86er, wie die CPU intern auf
Unterbrechungen reagiert, also bei einem Signal auf der Interrupt-Leitung in unsere Behandlungsroutine
wechselt.
Zumeist wollen wir damit auf asynchronere Ereignisse reagieren, die von externen Geräten
wieder rastatur kommen. Aber wie sind diese nun verschalten, damit sie die Unterbrechungen
der CPU auslösen können?
Ursprünglich gab es dafür den Programmable Interrupt Controller, PIC 8259A, an den bis
zu acht Geräte angeschlossen werden können. Der Controller prüft dauernd diese acht Leitungen,
hat dabei eine feste Priorität in 3 in Folge. Auch der Interrupt-Vektor wird entsprechend
der Leitungen hochgezählt, endbar ist nur der Start-Vektor, und zwar über IOPorts.
Üblicherweise war an der ersten Leitung des PICs der Timer, an der zweiten die Tastatur
verdrahtet, Leitung 3 und 4 für Seriell, 5 für den PC-Speaker, 6 für das Descan-Laufwerk
und die letzte Leitung für den Parallelport, an dem zum Beispiel ein Drucker hing.
Wenn nun auf der angeschlossenen Tastatur eine Taste gedrückt wird, fragt dies der
PIC ab und meldet es der CPU. Und ja, in der Standardeinstellung des PICs entsprechen
die Vektoren tatsächlich den x86-Traps, weshalb die Tastatur einen Interrupt-Vektor
1 verursacht, wegen der Nullindizierung. Nach der Unterbrechungsbehandlung muss die
CPU ein End of Interrupt senden. Erst danach lässt der PIC weitere Interrupts zu.
Da die acht Geräte schon bald nicht mehr ausreichten, wurde an die dritte Leitung ein
weiterer PIC angeschlossen. Mit diesem wurden Uhr, Maus, Co-Prozessor und Festplatte verbunden,
jedoch nur mit einer entsprechend seltsamen Prioritätenreihenfolge und zudem erhöhten
Latenzen. Aber das fundamentale Problem vom PIC ist, dass dieser nur für eine einzelne
CPU entwickelt wurde. Für Mehrkernsysteme ist er nicht geeignet.
Als Nachfolger wurde der Advanced Programmable Interrupt Controller, kurz APIC, entwickelt.
Dieser führt eine Aufteilung in Local APIC, kurz LAPIC, für jede CPU sowie einen gemeinsamen
IO-APIC ein. An den IO-APIC können bis zu 24 Geräte angeschlossen werden. Theoretisch
ist sogar der Betrieb mehrerer IO-APICs möglich. Dabei kann jedem Gerät eine beliebige Interrupt-Vektornummer
zugewiesen, sowie auch jeweils die Ziel-CPUs konfiguriert werden.
Beispielsweise können wir den IO-APIC so konfigurieren, dass die Tastatur an der zweiten Leitung
einen Interrupt-Vektor 33 an CPU 1 schickt. Wird nun eine Taste gedrückt, erkennt dies
der IO-APIC und legt eine entsprechende Nachricht auf den APIC-Bus. Der Local APIC der CPU 1
empfängt dies und teilt es der CPU mit. Nach der erfolgreichen Bearbeitung wird vom LAPIC
ein ACK an den IO-APIC gesendet. Für die Konfiguration der Geräte müssen
die Register des IO-APIC entsprechend konfiguriert werden. Allerdings gibt es keinen direkten
Zugriff auf diese Register. Es sind nur ein Index- und Datenregister im Speicher eingeblendet,
mit welchem ein indirekter Zugriff auf die internen Register erfolgen kann.
Die Adresse des internen Registers muss in das Indexregister geschrieben werden, welches
an der Speicheradresse 0xfic0000 liegt. Im Anschluss kann über das Datenregister 16
bytes weiter auf den Inhalt des gewählten internen Registers lesend und schreiben zugegriffen
werden. Dabei gibt es für uns folgende relevante
interne Register. Im ersten Register mit Index 0 wird die 4-bit-lange ID des IO-APIC gespeichert,
welche für die Nachrichten auf dem Bus wichtig ist und entsprechend konfiguriert werden
muss. Dann gibt es noch 24 Redirection-Table-Einträge.
Jeder Eintrag konfiguriert einen der Eingänge. Da der Eintrag 64-bit-lang ist, belegt jeder
Eintrag zwei interne Register. Für das Tastaturbeispiel wäre das RT1 und somit die internen Register
0x1-2 und 0x1-3. Dabei sind die Einträge wie folgt aufgebaut.
An der niedrigsten Adresse ist die auszulösende Vektornummer. Der Delivery Mode erlaubt unter
anderem eine Zustellung an alle CPUs oder mit lowest priority ein Durchwechsel der CPUs.
Der Destination Mode beeinflusst das Destination Field. Mit Logical kann man mittels Bitmaske
eine Gruppe von Zielprozessoren angeben, bei Physical kann eine konkrete CPU adressiert
Presenters
Zugänglich über
Offener Zugang
Dauer
00:05:16 Min
Aufnahmedatum
2020-08-06
Hochgeladen am
2020-10-16 18:16:24
Sprache
de-DE
Unterbrechungen durch externe Geräte mittels APIC für Aufgabe 2 der Lehrveranstaltung Betriebssysteme.
Folien und Transkript zum Video.